package com.jvm.synchronizedp;


// synchronized 同步代码块
public class Demo4 implements Runnable{

    static Demo4 instance = new Demo4();
    static volatile int i = 0;

    @Override
    public void run() {

        // 省略其它耗时操作...
        // 使用同步代码块对变量进行同步操作，锁对象为 instance
        /**
         *
         * 将 synchronized 作用于一个给定的实例对象 instance，
         * 即当前实例对象就是锁对象，每次当线程进入 synchronized
         * 包裹的代码块时就会要求当前线程持有 instance 实例对象锁，
         * 如果当前有其他线程正持有该对象锁，那么新到的线程就必须等待，
         * 这样也就保证了每次只有一个线程执行 i++;操作。
         *
         * 除了 instance 作为对象外，
         * 我们还可以使用 this 对象(代表当前实例)或者当前类的 class 对象作为锁
         *
         *
         */
        synchronized (instance) {
            for (int j = 0; j < 10000; j++) {
                i++;
            }
        }

//        synchronized (this) {
//            for (int j = 0; j < 10000; j++) {
//                i++;
//            }
//        }
//
//        synchronized (Demo4.class) {
//            for (int j = 0; j < 10000; j++) {
//                i++;
//            }
//        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(instance);
        Thread t2 = new Thread(instance);
        t1.start();
        t2.start();

        t1.join();
        t1.join();

        System.out.println(i);
    }
}
